package 中等.分类讨论;

/**
 * 给你一个字符串数组 board 表示井字游戏的棋盘。当且仅当在井字游戏过程中，棋盘有可能达到 board 所显示的状态时，才返回 true 。
 * <p>
 * 井字游戏的棋盘是一个 3 x 3 数组，由字符 ' '，'X' 和 'O' 组成。字符 ' ' 代表一个空位。
 * <p>
 * 以下是井字游戏的规则：
 * <p>
 * 玩家轮流将字符放入空位（' '）中。
 * 玩家 1 总是放字符 'X' ，而玩家 2 总是放字符 'O' 。
 * 'X' 和 'O' 只允许放置在空位中，不允许对已放有字符的位置进行填充。
 * 当有 3 个相同（且非空）的字符填充任何行、列或对角线时，游戏结束。
 * 当所有位置非空时，也算为游戏结束。
 * 如果游戏结束，玩家不允许再放置字符。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/valid-tic-tac-toe-state
 */
public class 有效的井字游戏_794 {

    public static void main(String[] args) {

        String[] str = {"O  ", "   ", "   "};
        System.out.println(validTicTacToe(str));

    }

    /**
     * 根据例题，X是先手，并且是游戏过程中可能达到的棋局
     * 棋局正常结束的三种情况：
     * <p>
     * 1，某一方胜利，X胜利->X=O+1，O胜利->X=O
     * 2，平局，0<=X-O<=1
     * 3，游戏未结束，0<=X-O<=1
     * <p>
     * 解：
     * 这是个九宫格，不需要复杂的使用搜索算法！！！
     *
     * @param board
     * @return
     */
    public static boolean validTicTacToe(String[] board) {
        int xTotal = 0, oTotal = 0;
        for (String s : board) {
            for (int i = 0; i < s.length(); i++) {
                if ('X' == (s.charAt(i))) {
                    xTotal++;
                } else if ('O' == (s.charAt(i))) {
                    oTotal++;
                }
            }
        }
        if (oTotal > xTotal || xTotal - oTotal > 1) {
            return false;
        }

        //X胜利
        if ("XXX".equals(board[0]) || "XXX".equals(board[1]) || "XXX".equals(board[2])) {
            if (xTotal - oTotal != 1) {
                return false;
            }
        }
        if ('X' == (board[0].charAt(0)) && 'X' == (board[1].charAt(1)) && 'X' == (board[2].charAt(2))) {
            if (xTotal - oTotal != 1) {
                return false;
            }

        }
        if ('X' == (board[2].charAt(0)) && 'X' == (board[1].charAt(1)) && 'X' == (board[0].charAt(2))) {
            if (xTotal - oTotal != 1) {
                return false;
            }

        }
        if ('X' == (board[0].charAt(0)) && 'X' == (board[1].charAt(0)) && 'X' == (board[2].charAt(0))) {
            if (xTotal - oTotal != 1) {
                return false;
            }

        }
        if ('X' == (board[0].charAt(1)) && 'X' == (board[1].charAt(1)) && 'X' == (board[2].charAt(1))) {
            if (xTotal - oTotal != 1) {
                return false;
            }

        }
        if ('X' == (board[0].charAt(2)) && 'X' == (board[1].charAt(2)) && 'X' == (board[2].charAt(2))) {
            if (xTotal - oTotal != 1) {
                return false;
            }

        }
        //O胜利
        if ("OOO".equals(board[0]) || "OOO".equals(board[1]) || "OOO".equals(board[2])) {
            if (xTotal - oTotal != 0) {
                return false;
            }
        }
        if ('O' == (board[0].charAt(0)) && 'O' == (board[1].charAt(1)) && 'O' == (board[2].charAt(2))) {
            if (xTotal - oTotal != 0) {
                return false;
            }

        }
        if ('O' == (board[2].charAt(0)) && 'O' == (board[1].charAt(1)) && 'O' == (board[0].charAt(2))) {
            if (xTotal - oTotal != 0) {
                return false;
            }

        }
        if ('O' == (board[0].charAt(0)) && 'O' == (board[1].charAt(0)) && 'O' == (board[2].charAt(0))) {
            if (xTotal - oTotal != 0) {
                return false;
            }

        }
        if ('O' == (board[0].charAt(1)) && 'O' == (board[1].charAt(1)) && 'O' == (board[2].charAt(1))) {
            if (xTotal - oTotal != 0) {
                return false;
            }

        }
        if ('O' == (board[0].charAt(2)) && 'O' == (board[1].charAt(2)) && 'O' == (board[2].charAt(2))) {
            if (xTotal - oTotal != 0) {
                return false;
            }

        }
        return true;
    }

}
